/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package net.acesinc.data.json.util;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.ValueNode;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
/**
*
* @author andrewserff
*/
public class JsonUtils {
private ObjectMapper mapper;
public JsonUtils() {
mapper = new ObjectMapper();
}
public String flattenJson(String json) throws IOException {
Map<String, Object> outputMap = new LinkedHashMap<>();
flattenJsonIntoMap("", mapper.readTree(json), outputMap);
return mapper.writeValueAsString(outputMap);
}
public void flattenJsonIntoMap(String currentPath, JsonNode jsonNode, Map<String, Object> map) {
if (jsonNode.isObject()) {
ObjectNode objectNode = (ObjectNode) jsonNode;
Iterator<Map.Entry<String, JsonNode>> iter = objectNode.fields();
String pathPrefix = currentPath.isEmpty() ? "" : currentPath + ".";
while (iter.hasNext()) {
Map.Entry<String, JsonNode> entry = iter.next();
flattenJsonIntoMap(pathPrefix + entry.getKey(), entry.getValue(), map);
}
} else if (jsonNode.isArray()) {
ArrayNode arrayNode = (ArrayNode) jsonNode;
for (int i = 0; i < arrayNode.size(); i++) {
flattenJsonIntoMap(currentPath + "[" + i + "]", arrayNode.get(i), map);
}
} else if (jsonNode.isValueNode()) {
ValueNode valueNode = (ValueNode) jsonNode;
Object value = null;
if (valueNode.isNumber()) {
value = valueNode.numberValue();
} else if (valueNode.isBoolean()) {
value = valueNode.asBoolean();
} else if (valueNode.isTextual()){
value = valueNode.asText();
}
map.put(currentPath, value);
}
}
}